package com.imgpro.Utils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; // Jackson import
import com.imgpro.constants.PromoteConstant;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \
//        -H "Content-Type: application/json" \
//        -H "Authorization: Bearer 2c6dcf7a-d5e9-47b9-895f-0a7eb53cff21" \
//        -d $'{
//        "model": "doubao-vision-pro-32k-241028",


@Slf4j
public class DoubaoUtil {


    // --- 配置区域 ---
    // API 端点 URL
    private static final String API_URL = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
    // 你的 Bearer Token - !! 非常重要：请替换成你自己的有效 Token !!
    private static final String BEARER_TOKEN = "2c6dcf7a-d5e9-47b9-895f-0a7eb53cff21"; // 示例 Token，可能已失效
    // 使用的模型名称
    private static final String MODEL_NAME = "doubao-vision-pro-32k-241028";
    // --- 配置区域结束 ---



    // 可重用的 HttpClient 实例 (线程安全)
    private static final HttpClient httpClient = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_1_1) // 或者 HTTP_2
            .build();

    // 可重用的 ObjectMapper 实例 (线程安全)
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 调用视觉 API，传入文本提示和图像 URL。
     *
     * @param prompt   用户的文本问题/提示。
     * @param imageUrl 要分析的图像的 URL。
     * @return API 返回的响应体 (通常是 JSON 字符串)。
     * @throws IOException          如果发生网络 I/O 错误。
     * @throws InterruptedException 如果线程在等待时被中断。
     * @throws RuntimeException     如果 JSON 序列化失败或 API 返回错误状态码。
     */
    public static String callVisionApi(String prompt, String imageUrl)
            throws IOException, InterruptedException {




        // 1. 使用 Map 和 List 构建请求体结构
        // 文本内容部分
        Map<String, Object> textContent = Map.of(
                "type", "text",
                "text", prompt
        );

        // 图片 URL 内容部分
        Map<String, Object> imageUrlDetail = Map.of("url", imageUrl);
        Map<String, Object> imageUrlContent = Map.of(
                "type", "image_url",
                "image_url", imageUrlDetail
        );

        // 将文本和图片组合到 content 列表中
        List<Map<String, Object>> contentList = List.of(textContent, imageUrlContent); // Java 9+ List.of

        // 构建 message 对象
        Map<String, Object> message = Map.of(
                "role", "user",
                "content", contentList
        );

        // 构建最外层的请求体 Map
        // 使用 HashMap 如果后续可能需要添加其他可选参数（如 temperature）
        Map<String, Object> requestBodyMap = new HashMap<>();
        requestBodyMap.put("model", MODEL_NAME);
        requestBodyMap.put("messages", List.of(message)); // messages 是一个列表
        // requestBodyMap.put("temperature", 0.7); // 例如，如果需要添加 temperature 参数

        // 2. 将 Map 序列化为 JSON 字符串
        String jsonBody;
        try {
            jsonBody = objectMapper.writeValueAsString(requestBodyMap);
//            System.out.println("构造的请求体 JSON: " + jsonBody); // 调试输出
        } catch (com.fasterxml.jackson.core.JsonProcessingException e) {
            // 处理 JSON 序列化异常
            throw new RuntimeException("无法将请求对象序列化为 JSON", e);
        }

        // 3. 创建 HTTP 请求 (POST)
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(API_URL)) // 设置请求的 URL
                .header("Content-Type", "application/json") // 设置 Content-Type 头
                .header("Authorization", "Bearer " + BEARER_TOKEN) // 设置 Authorization 头
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) // 设置请求方法为 POST 并传入请求体
                .build();

        // 4. 发送请求并获取响应
        // BodyHandlers.ofString() 表示我们期望响应体是字符串形式
//        System.out.println("正在向 API 发送请求...");
        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

        // 5. 处理响应
        int statusCode = response.statusCode();
        String responseBody = response.body();

        if (statusCode >= 200 && statusCode < 300) {
            // 请求成功 (2xx 状态码)
//            System.out.println("API 调用成功，状态码: " + statusCode);
            return extractContentFromJson(responseBody);
//            return responseBody;
        } else {
            // 请求失败
            System.err.println("API 调用失败，状态码: " + statusCode);
            System.err.println("错误响应体: " + responseBody);
            // 抛出异常或者返回错误信息，取决于你的错误处理策略
            throw new RuntimeException("API 请求失败，状态码: " + statusCode + ", 响应: " + responseBody);
        }
    }


    public static String extractContentFromJson(String apiResponse) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 将 JSON 字符串解析为 JsonNode
            JsonNode rootNode = objectMapper.readTree(apiResponse);

            // 提取 choices 数组中的第一个元素
            JsonNode firstChoice = rootNode.path("choices").get(0);

            // 提取 message 对象中的 content
            return firstChoice.path("message").path("content").asText();
        } catch (IOException e) {
            // 捕获异常并打印错误信息
            System.err.println("Error extracting content: " + e.getMessage());
            return null;
        }
    }


    // --- 主函数：示例如何调用 ---
    public static void main(String[] args) {
        // --- 请替换为你的实际输入 ---
        String userImageUrl = "https://hbbjava.oss-cn-chengdu.aliyuncs.com/2025/04/7c49bfa4-dd92-4099-a41a-e773fae5e1fb.png";
        // --- 确保上面的 BEARER_TOKEN 已替换为你的有效 Token ---

        try {
//            System.out.println("调用 Vision API...");
//            System.out.println("Prompt: " + userPrompt);
//            System.out.println("Image URL: " + userImageUrl);

            String apiResponse = callVisionApi(PromoteConstant.DEFAULT_PROMOTE, userImageUrl);

//            String extractedContent = extractContentFromJson(apiResponse);

//            System.out.println("\n--- API 响应 ---");
//            System.out.println(apiResponse);
//            可选：尝试解析返回的 JSON (如果需要)

            log.info("extractedContent: " + apiResponse);


        } catch (IOException e) {
            System.err.println("网络或 I/O 错误: " + e.getMessage());
            e.printStackTrace();
        } catch (InterruptedException e) {
            System.err.println("请求被中断: " + e.getMessage());
            Thread.currentThread().interrupt(); // 恢复中断状态
            e.printStackTrace();
        } catch (RuntimeException e) {
            System.err.println("运行时错误 (可能来自 API 失败或 JSON 处理): " + e.getMessage());
            e.printStackTrace();
        }
    }
}